\subsubsection{Виртуальные методы}

И снова простой пример:

\lstinputlisting[style=customc]{\CURPATH/classes/classes4_virtual.cpp}

У класса \IT{object} есть виртуальный метод \TT{dump()}, 
впоследствии заменяемый в классах-наследниках \IT{box} и \IT{sphere}.


Если в какой-то среде, где неизвестно, какого типа является экземпляр класса, как в функции \main в примере, 
вызывается виртуальный метод \TT{dump()}, где-то должна сохраняться информация о том, какой же метод в итоге 
вызвать.


Скомпилируем в MSVC 2008 с опциями \Ox и \Obzero и посмотрим код функции \main:


\lstinputlisting[style=customasmx86]{\CURPATH/classes/classes4_1.asm}

Указатель на функцию \TT{dump()} берется откуда-то из экземпляра класса (объекта). 
Где мог записаться туда адрес нового метода-функции?
Только в конструкторах, больше негде: ведь в функции \main ничего более не вызывается.

\footnote{Об указателях на функции читайте больше в соответствующем разделе:(\myref{sec:pointerstofunctions})}

Посмотрим код конструктора класса \IT{box}:


\lstinputlisting[style=customasmx86]{\CURPATH/classes/classes4_2.asm}

Здесь мы видим, что разметка класса немного другая: в качестве первого поля имеется указатель 
на некую таблицу \TT{box::`vftable'} (название оставлено компилятором MSVC).


\label{RTTI}
\myindex{\Cpp!RTTI}
В этой таблице есть ссылка на таблицу с названием \\
\TT{box::`RTTI Complete Object Locator'} и еще ссылка на 
метод \TT{box::dump()}.

Итак, это называется таблица виртуальных методов и \ac{RTTI}.
Таблица виртуальных методов хранит в себе адреса методов, а \ac{RTTI} хранит информацию о типах вообще.

Кстати, \ac{RTTI}-таблицы --- это именно те таблицы, информация из которых используются при вызове \IT{dynamic\_cast} и \IT{typeid} в \Cpp. 
Вы можете увидеть, что здесь хранится даже имя класса в виде обычной строки.

Так, какой-нибудь метод базового класса \IT{object} может вызвать виртуальный метод \TT{object::dump()} что 
в итоге вызовет нужный метод унаследованного класса, потому что информация о нем присутствует прямо в этой 
структуре класса.


Работа с этими таблицами и поиск адреса нужного метода, занимает какое-то время процессора, возможно, 
поэтому считается что работа с виртуальными методами медленна.


В сгенерированном коде от GCC \ac{RTTI}-таблицы устроены чуть-чуть иначе.

% TODO: добавить...
